package com.neuedu.hw20190221;

/**
 * 1、输入一个目录地址，打印该目录下的所有的文件信息，如果还有子目录，继续递归打印该目录下文件信息；（递归）
 * 2、在第1题基础之上，输入一个关键字，只显示包含该关键字的文件信息；
 */

import java.io.File;
import java.io.FileFilter;
import java.util.Scanner;

public class HomeWork20190221 {
    public static void main(String[] args) {
        test02();
    }
    /**
     * 输入一个目录，遍历该目录下所有的文件信息（递归）
     */

    private static void test01(){
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入文件信息：");
        String s=new String(scanner.nextLine());
        //输入的字符串s就是文件的路径字符串
        File file=new File(s);
        digui(file);

    }



    /**
     * 递归文件遍历
     * @param file
     */
    private static void digui(File file){
        //1、必须有结束的方式或者条件（自然结束退出）
        //2、自调用过程

        //判断文件是否存在
        if (file.exists()){
            //判断是否是文件
            if (file.isFile()){
                //file是文件，则输出文件的绝对路径
                System.out.println("文件："+file.getAbsolutePath());

            }else if (file.isDirectory()){//判断file是不是目录
                //如果是目录，则输出目录的信息
                System.out.println("目录："+file.getAbsolutePath());
                //取出该目录下的所有的文件对象
                File[]subfiles=file.listFiles();
                //递归遍历当前目录下的每一个子文件对象
                for (File f:subfiles){
                    //递归调用，进行子文件遍历
                    digui(f);
                }

            }
        }

    }

    /**
     * 输入一个目录，遍历该目录下的所有的文件信息（递归）
     * 并根据录入的关键信息，进行文件筛选
     */
    private static void test02(){
        //输入方法
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入文件信息：");
        String s=new String(scanner.nextLine());
        System.out.println("请输入关键字：");
        //string存放关键字
        String strKW=new String(scanner.nextLine());
        //输入的字符串s就是文件的路径字符串
        File file=new File(s);
        //对file调用递归方法
        diguiDirWithSearch(file,strKW);
    }

    /**
     * 递归文件遍历，并根据关键字进行查找
     * @param file 遍历的目录
     * @param keyWord 查找的关键字
     */

    private static void diguiDirWithSearch(File file,String keyWord){
        //1、必须有结束的方式或条件（自然结束退出）
        //2、自调用过程（自己调用自己）

        //判断文件是否存在
        if (file.exists()){
            //判断是否是文件
            if (file.isFile()){
                //file是文件，则输出文件的绝对路径
                System.out.println("文件："+file.getAbsolutePath());

            }else if (file.isDirectory()){//判断file是不是目录
                //如果是目录，则输出目录的信息
                //System.out.println("目录："+file.getAbsolutePath());
                //取出该目录下的所有的文件对象
                //使用文件过滤器接口对存入File数组数组结果中的文件对象进行筛选
                //文件过滤器接口中的accept方法，如果返回true，
                //则子文件就会保存在结果数组中，否则不在结果数组中
                File[]subfiles=file.listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        //文件过滤处理
                        if (pathname.isDirectory()){
                            //目录直接返回true，不进行过滤处理
                            return true;
                        }else {
                            //针对文件名进行过滤
                            //判断当前文件是否满足筛选条件，如果满足则返回true，就会包括在结果数组中
                            if (pathname.getName()!=null&&pathname.getName().contains(keyWord)){
                                return true;
                            }else {
                                //如果不满足筛选条件，则返回false，则该文件不包含在结果数组中
                                return false;
                            }
                        }

                    }
                });
                //递归遍历当前目录下的每一个子文件对象
                for (File f:subfiles){
                    //递归调用，进行子文件遍历
                    digui(f);
                }

            }

        }
    }

}
